/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia;

import java.sql.*;
import java.util.ArrayList;
import java.util.TreeSet;
import java.util.logging.Level;
import java.util.logging.Logger;
import negocio.ComparadorRanking;
import negocio.Paginacion;
import negocio.Tabla;
import negocio.TrucoSuperado;
import negocio.Usuario;

/**
 *
 * @author JAVA
 */
public class PersistenciaUsuario {
    
    public static int guardarUsuario(Usuario u){
        int i = 0;
        try {
            Conexion conexion=new Conexion();
            i = conexion.open().executeUpdate("insert into usuario (id,nombre,apellidos,email,password,edad,peso,altura,ciudad,baja,sexo,estilo,nivel,puntuacion,foto) values(0,'"+u.getNombre()+"','"+u.getApellidos()+"','"+u.getEmail()+"','"+u.getPassword()+"',"+u.getEdad()+","+u.getPeso()+","+u.getAltura()+",'"+u.getCiudad()+"',0,'"+u.getSexo()+"','"+u.getEstilo()+"','"+u.getNivel()+"',"+u.getPuntuacion()+",'"+u.getFoto()+"')");
            conexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(PersistenciaTabla.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            return i;
        }
    }
    
    public static int eliminarUsuario(Usuario u){
        int i = 0;
        try {
            Conexion conexion=new Conexion();
            i = conexion.open().executeUpdate("update usuario set baja=1 where usuario.id="+u.getId());
            conexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(PersistenciaTabla.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            return i;
        }
    }
    
    public static ArrayList<Usuario> buscarUsuariosNomYApe(String s){
        ArrayList<Usuario> listaPre=new ArrayList<Usuario>();
        ArrayList<Usuario> listaPost=new ArrayList<Usuario>();
        try{
            Conexion conexion=new Conexion();
            ResultSet rset=conexion.open().executeQuery("select id,nombre,apellidos,email,password,edad,peso,altura,ciudad,sexo,estilo,nivel,puntuacion,ranking,foto from usuario where usuario.baja=0");
            while(rset.next()){
                int id=rset.getInt("id");
                String nombre=rset.getString("nombre");
                String apellidos=rset.getString("apellidos");
                String email=rset.getString("email");
                String pass=rset.getString("password");
                int edad=rset.getInt("edad");
                double peso=rset.getDouble("peso");
                int altura=rset.getInt("altura");
                String ciudad=rset.getString("ciudad");
                String sexo=rset.getString("sexo");
                String estilo=rset.getString("estilo");
                String nivel=rset.getString("nivel");
                int puntuacion=rset.getInt("puntuacion");
                int ranking=rset.getInt("ranking");
                String foto=rset.getString("foto");
                
                Usuario u=new Usuario(id,nombre,apellidos,email,pass,edad,peso,altura,ciudad,sexo,estilo,nivel,puntuacion,ranking,foto);
                ArrayList<Tabla> listaTablas=PersistenciaTabla.obtenerTablas(u);
                ArrayList<TrucoSuperado> listaTrucos=PersistenciaTrucoSuperado.obtenerTrucosSuperados(u);
                ArrayList<Usuario> listaUsuarios=amigos(u);
                Usuario usuario=new Usuario(u.getNombre(),u.getApellidos(),u.getPassword(),u.getEmail(),u.getCiudad(),u.getEdad(),u.getAltura(),u.getPeso(),u.getSexo(),u.getEstilo(),listaTablas,u.getNivel(),listaTrucos,u.getRanking(),u.getPuntuacion(),listaUsuarios,u.getId(),u.getFoto());
                listaPre.add(usuario);
            }
            conexion.close();
            for(Usuario user:listaPre){
                if(user.getNombre().toLowerCase().contains(s.toLowerCase()) || user.getApellidos().toLowerCase().contains(s.toLowerCase())){
                    listaPost.add(user);
                }
            }

        }catch (SQLException ex) {
            Logger.getLogger(PersistenciaTabla.class.getName()).log(Level.SEVERE, null, ex);
        }finally{          
            return listaPost;
        }
    }
    
    public static ArrayList<Usuario> buscarUsuariosOtros(String email,String ciudad,String estilo,String nivel){
        ArrayList<Usuario> listaPost=new ArrayList<Usuario>();
        try{
            Conexion conexion=new Conexion();
            ResultSet rset=conexion.open().executeQuery("select id,nombre,apellidos,email,password,edad,peso,altura,ciudad,sexo,estilo,nivel,puntuacion,ranking,foto from usuario where usuario.baja=0 and usuario.email like '%"+email+"%' and usuario.ciudad like '%"+ciudad+"%' and usuario.estilo like '%"+estilo+"%' and usuario.nivel like '%"+nivel+"%'");
            while(rset.next()){
                int id=rset.getInt("id");
                String nombre=rset.getString("nombre");
                String apellidos=rset.getString("apellidos");
                String correo=rset.getString("email");
                String pass=rset.getString("password");
                int edad=rset.getInt("edad");
                double peso=rset.getDouble("peso");
                int altura=rset.getInt("altura");
                String city=rset.getString("ciudad");
                String sexo=rset.getString("sexo");
                String style=rset.getString("estilo");
                String level=rset.getString("nivel");
                int puntuacion=rset.getInt("puntuacion");
                int ranking=rset.getInt("ranking");
                String foto=rset.getString("foto");
                
                Usuario u=new Usuario(id,nombre,apellidos,correo,pass,edad,peso,altura,city,sexo,style,level,puntuacion,ranking,foto);
                ArrayList<Tabla> listaTablas=PersistenciaTabla.obtenerTablas(u);
                ArrayList<TrucoSuperado> listaTrucos=PersistenciaTrucoSuperado.obtenerTrucosSuperados(u);
                ArrayList<Usuario> listaUsuarios=amigos(u);
                Usuario usuario=new Usuario(u.getNombre(),u.getApellidos(),u.getPassword(),u.getEmail(),u.getCiudad(),u.getEdad(),u.getAltura(),u.getPeso(),u.getSexo(),u.getEstilo(),listaTablas,u.getNivel(),listaTrucos,u.getRanking(),u.getPuntuacion(),listaUsuarios,u.getId(),u.getFoto());
                listaPost.add(usuario);
            }
            conexion.close();
        }catch (SQLException ex) {
            Logger.getLogger(PersistenciaTabla.class.getName()).log(Level.SEVERE, null, ex);
        }finally{          
            return listaPost;
        }
    }
    
    public static int actualizarUsuario(Usuario usuario){
        int i = 0;
        try {
            Conexion conexion=new Conexion();
            i = conexion.open().executeUpdate("update usuario set nombre='"+usuario.getNombre()+"', apellidos='"+usuario.getApellidos()+"', email='"+usuario.getEmail()+"', password='"+usuario.getPassword()+"', edad="+usuario.getEdad()+", peso="+usuario.getPeso()+", altura="+usuario.getAltura()+", ciudad='"+usuario.getCiudad()+"', sexo='"+usuario.getSexo()+"', estilo='"+usuario.getEstilo()+"', nivel='"+usuario.getNivel()+"', puntuacion="+usuario.getPuntuacion()+", ranking="+usuario.getRanking()+", foto='"+usuario.getFoto()+"' where usuario.id="+usuario.getId());
            conexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(PersistenciaTabla.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            return i;
        }
    }
    
    public static ArrayList<Usuario> amigos(Usuario u){
        ArrayList<Usuario> listaUsuarios=new ArrayList<Usuario>();
        ArrayList<Integer> listaIdes=new ArrayList<Integer>();
        try{
            Conexion conexion=new Conexion();
            ResultSet rset=conexion.open().executeQuery("select idUsuarioSeguido from amigos where amigos.idUsuario="+u.getId());
            while(rset.next()){
                listaIdes.add(rset.getInt("idUsuarioSeguido"));
            }
            rset.close();
            
            for (int index=0;index<listaIdes.size();index++) {
                Conexion conexion2=new Conexion();
                ResultSet rset2 = conexion2.open().executeQuery("select id,nombre,apellidos,email,password,edad,peso,altura,ciudad,sexo,estilo,nivel,puntuacion,ranking,foto from usuario where usuario.id=" + listaIdes.get(index) + " and usuario.baja=0");
                while (rset2.next()) {
                    int id = rset2.getInt("id");
                    String nombre = rset2.getString("nombre");
                    String apellidos = rset2.getString("apellidos");
                    String email = rset2.getString("email");
                    String pass = rset2.getString("password");
                    int edad = rset2.getInt("edad");
                    double peso = rset2.getDouble("peso");
                    int altura = rset2.getInt("altura");
                    String ciudad = rset2.getString("ciudad");
                    String sexo = rset2.getString("sexo");
                    String estilo = rset2.getString("estilo");
                    String nivel = rset2.getString("nivel");
                    int puntuacion = rset2.getInt("puntuacion");
                    int ranking=rset2.getInt("ranking");
                    String foto=rset2.getString("foto");

                    Usuario usuario = new Usuario(id, nombre, apellidos, email, pass, edad, peso, altura, ciudad, sexo, estilo, nivel, puntuacion,ranking,foto);
                    listaUsuarios.add(usuario);
                }
                conexion2.close();
            }
            conexion.close();
        }catch (SQLException ex) {
            Logger.getLogger(PersistenciaTabla.class.getName()).log(Level.SEVERE, null, ex);
        }finally{          
            return listaUsuarios;
        }
    }
    
    
    public static boolean existeUsuario(Usuario u){
        boolean b=false;
        try{
            Conexion conexion=new Conexion();
            ResultSet rset=conexion.open().executeQuery("select id from usuario where usuario.id="+u.getId()+" and usuario.baja=0");
            while(rset.next()){
                b=true;
            }
        }catch (SQLException ex) {
            Logger.getLogger(PersistenciaTabla.class.getName()).log(Level.SEVERE, null, ex);
        }finally{          
            return b;
        }
    }
    
    
    public static Usuario obtenerUsuario(String email, String pass){
        Usuario usuario=null;
        Usuario u=null;
        try{
            Conexion conexion=new Conexion();
            ResultSet rset=conexion.open().executeQuery("select id,nombre,apellidos,email,password,edad,peso,altura,ciudad,sexo,estilo,nivel,puntuacion,ranking,foto from usuario where usuario.email='"+email+"' and usuario.password='"+pass+"' and usuario.baja=0");
            while(rset.next()){
                int id=rset.getInt("id");
                String nombre=rset.getString("nombre");
                String apellidos=rset.getString("apellidos");
                int edad=rset.getInt("edad");
                double peso=rset.getDouble("peso");
                int altura=rset.getInt("altura");
                String ciudad=rset.getString("ciudad");
                String sexo=rset.getString("sexo");
                String estilo=rset.getString("estilo");
                String nivel=rset.getString("nivel");
                int puntuacion=rset.getInt("puntuacion");
                int ranking=rset.getInt("ranking");
                String foto=rset.getString("foto");
                
                u=new Usuario(id,nombre,apellidos,email,pass,edad,peso,altura,ciudad,sexo,estilo,nivel,puntuacion,ranking,foto);
            }
            conexion.close();
            ArrayList<Tabla> listaTablas=PersistenciaTabla.obtenerTablas(u);
            ArrayList<TrucoSuperado> listaTrucos=PersistenciaTrucoSuperado.obtenerTrucosSuperados(u);
            ArrayList<Usuario> listaUsuarios=amigos(u);
            
            usuario=new Usuario(u.getNombre(),u.getApellidos(),u.getPassword(),u.getEmail(),u.getCiudad(),u.getEdad(),u.getAltura(),u.getPeso(),u.getSexo(),u.getEstilo(),listaTablas,u.getNivel(),listaTrucos,u.getRanking(),u.getPuntuacion(),listaUsuarios,u.getId(),u.getFoto());


        }catch (SQLException ex) {
            Logger.getLogger(PersistenciaTabla.class.getName()).log(Level.SEVERE, null, ex);
        }finally{          
            return usuario;
        }
    }
    
    public static Usuario obtenerUsuario(int id){
        Usuario usuario=null;
        Usuario u=null;
        try{
            Conexion conexion=new Conexion();
            ResultSet rset=conexion.open().executeQuery("select id,nombre,apellidos,email,password,edad,peso,altura,ciudad,sexo,estilo,nivel,puntuacion,ranking,foto from usuario where usuario.id="+id);
            while(rset.next()){
                String nombre=rset.getString("nombre");
                String apellidos=rset.getString("apellidos");
                String email=rset.getString("email");
                String pass=rset.getString("password");
                int edad=rset.getInt("edad");
                double peso=rset.getDouble("peso");
                int altura=rset.getInt("altura");
                String ciudad=rset.getString("ciudad");
                String sexo=rset.getString("sexo");
                String estilo=rset.getString("estilo");
                String nivel=rset.getString("nivel");
                int puntuacion=rset.getInt("puntuacion");
                int ranking=rset.getInt("ranking");
                String foto=rset.getString("foto");
                
                u=new Usuario(id,nombre,apellidos,email,pass,edad,peso,altura,ciudad,sexo,estilo,nivel,puntuacion,ranking,foto);
            }
            conexion.close();
            ArrayList<Tabla> listaTablas=PersistenciaTabla.obtenerTablas(u);
            ArrayList<TrucoSuperado> listaTrucos=PersistenciaTrucoSuperado.obtenerTrucosSuperados(u);
            ArrayList<Usuario> listaUsuarios=amigos(u);
            
            usuario=new Usuario(u.getNombre(),u.getApellidos(),u.getPassword(),u.getEmail(),u.getCiudad(),u.getEdad(),u.getAltura(),u.getPeso(),u.getSexo(),u.getEstilo(),listaTablas,u.getNivel(),listaTrucos,u.getRanking(),u.getPuntuacion(),listaUsuarios,u.getId(),u.getFoto());


        }catch (SQLException ex) {
            Logger.getLogger(PersistenciaTabla.class.getName()).log(Level.SEVERE, null, ex);
        }finally{          
            return usuario;
        }
    }
    
    public static int seguirUsuario(Usuario u, Usuario amigo){
        int i=0;
        try{
            Conexion conexion=new Conexion();
            i = conexion.open().executeUpdate("insert into amigos (id,idUsuario,idUsuarioSeguido) values(0,"+u.getId()+","+amigo.getId()+")");
            conexion.close();
        }catch (SQLException ex) {
            Logger.getLogger(PersistenciaTabla.class.getName()).log(Level.SEVERE, null, ex);
        }finally{          
            return i;
        }
    }
    
    public static int dejarSeguirUsuario(Usuario u, Usuario amigo){
        int i=0;
        try{
            Conexion conexion=new Conexion();
            i = conexion.open().executeUpdate("delete from amigos where amigos.idUsuario="+u.getId()+" and amigos.idUsuarioSeguido="+amigo.getId());
            conexion.close();
        }catch (SQLException ex) {
            Logger.getLogger(PersistenciaTabla.class.getName()).log(Level.SEVERE, null, ex);
        }finally{          
            return i;
        }
    }
    
    public static boolean existeAmigo(Usuario u, Usuario amigo){
        boolean b=false;
        try{
            Conexion conexion=new Conexion();
            ResultSet rset=conexion.open().executeQuery("select id from amigos where amigos.idUsuario="+u.getId()+" and amigos.idUsuarioSeguido="+amigo.getId());
            while(rset.next()){
                b=true;
            }
            conexion.close();
        }catch (SQLException ex) {
            Logger.getLogger(PersistenciaTabla.class.getName()).log(Level.SEVERE, null, ex);
        }finally{          
            return b;
        }
    }
    
    public static String subirNivel(Usuario u){
        int i=0;
        String nivel=u.getNivel();
        String siguienteNivel="";
        try {
            
            Conexion conexion=new Conexion();
            i = conexion.open().executeUpdate("update usuario set nivel='"+siguienteNivel+"' where usuario.id="+u.getId());
            conexion.close();
        } catch (SQLException ex) {
            Logger.getLogger(PersistenciaTabla.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            if (i > 0) {
                if ("novice".equals(u.getNivel())) {
                    siguienteNivel = "benginner";
                }
                if ("benginner".equals(u.getNivel())) {
                    siguienteNivel = "intermediate";
                }
                if ("intermediate".equals(u.getNivel())) {
                    siguienteNivel = "expert";
                }
                if ("expert".equals(u.getNivel())) {
                    siguienteNivel = "extreme";
                }
                if ("extreme".equals(u.getNivel())) {
                    siguienteNivel = "extreme";
                }
                nivel=siguienteNivel;
            }
            return nivel;
        }
    }
    
    public static boolean existeEmail(Usuario u){
        boolean b=false;
        try{
            Conexion conexion=new Conexion();
            ResultSet rset=conexion.open().executeQuery("select id from usuario where usuario.email='"+u.getEmail()+"'");
            while(rset.next()){
                b=true;
            }
            conexion.close();
        }catch (SQLException ex) {
            Logger.getLogger(PersistenciaTabla.class.getName()).log(Level.SEVERE, null, ex);
        }finally{          
            return b;
        }
    }
    
    public static boolean esAmigo(Usuario u,Usuario amigo){
        boolean b=false;
        try{
            Conexion conexion=new Conexion();
            ResultSet rset=conexion.open().executeQuery("select id from amigos where amigos.idUsuario="+u.getId()+" and amigos.idUsuarioSeguido="+amigo.getId());
            while(rset.next()){
                b=true;
            }
            conexion.close();
        }catch (SQLException ex) {
            Logger.getLogger(PersistenciaTabla.class.getName()).log(Level.SEVERE, null, ex);
        }finally{          
            return b;
        }
    }
    
    public static ArrayList<Usuario> obtenerTodosUsuarios(){
        ArrayList<Usuario> lista=new ArrayList<Usuario>();
        try{
            Conexion conexion=new Conexion();
            ResultSet rset=conexion.open().executeQuery("select * from usuario where usuario.baja=0");
            while(rset.next()){
                int id=rset.getInt("id");
                String nombre=rset.getString("nombre");
                String apellidos=rset.getString("apellidos");
                String email=rset.getString("email");
                String pass=rset.getString("password");
                int edad=rset.getInt("edad");
                double peso=rset.getDouble("peso");
                int altura=rset.getInt("altura");
                String ciudad=rset.getString("ciudad");
                String sexo=rset.getString("sexo");
                String estilo=rset.getString("estilo");
                String nivel=rset.getString("nivel");
                int puntuacion=rset.getInt("puntuacion");
                int ranking=rset.getInt("ranking");
                String foto=rset.getString("foto");
                
                Usuario u=new Usuario(id,nombre,apellidos,email,pass,edad,peso,altura,ciudad,sexo,estilo,nivel,puntuacion,ranking,foto);
                
                ArrayList<Tabla> listaTablas=PersistenciaTabla.obtenerTablas(u);
                ArrayList<TrucoSuperado> listaTrucos=PersistenciaTrucoSuperado.obtenerTrucosSuperados(u);
                ArrayList<Usuario> listaUsuarios=amigos(u);
                
                Usuario usuario=new Usuario(nombre,apellidos,pass,email,ciudad,edad,altura,peso,sexo,estilo,listaTablas,nivel,listaTrucos,ranking,puntuacion,listaUsuarios,id,foto);
                lista.add(usuario);
            }
            conexion.close();
        }catch (SQLException e){
            Logger.getLogger(PersistenciaTabla.class.getName()).log(Level.SEVERE, null, e);
        }finally{
            return lista;
        }
    }
    
    public static int contadorUsuarios(){
        int contador=0;
        try{
            Conexion conexion=new Conexion();
            ResultSet rset=conexion.open().executeQuery("select count(*) as contador from usuario where usuario.baja=0");
            while(rset.next()){
                contador=rset.getInt("contador");
            }
            conexion.close();
        }catch (SQLException ex) {
            Logger.getLogger(PersistenciaTabla.class.getName()).log(Level.SEVERE, null, ex);
        }finally{          
            return contador;
        }
    }
    
    public static TreeSet<Usuario> obtenerUsuariosRankingPaginados(Paginacion p){
        TreeSet<Usuario> set=new TreeSet<Usuario>(new ComparadorRanking());
        try{
            Conexion conexion=new Conexion();
            ResultSet rset=conexion.open().executeQuery("select * from usuario where usuario.baja=0 limit "+p.getRegistrosPagina()+" offset "+p.getPaginaActual()+"");
            while(rset.next()){
                int id=rset.getInt("id");
                String nombre=rset.getString("nombre");
                String apellidos=rset.getString("apellidos");
                String email=rset.getString("email");
                String pass=rset.getString("password");
                int edad=rset.getInt("edad");
                double peso=rset.getDouble("peso");
                int altura=rset.getInt("altura");
                String ciudad=rset.getString("ciudad");
                String sexo=rset.getString("sexo");
                String estilo=rset.getString("estilo");
                String nivel=rset.getString("nivel");
                int puntuacion=rset.getInt("puntuacion");
                int ranking=rset.getInt("ranking");
                String foto=rset.getString("foto");
                
                Usuario u=new Usuario(id,nombre,apellidos,email,pass,edad,peso,altura,ciudad,sexo,estilo,nivel,puntuacion,ranking,foto);
                
                ArrayList<Tabla> listaTablas=PersistenciaTabla.obtenerTablas(u);
                ArrayList<TrucoSuperado> listaTrucos=PersistenciaTrucoSuperado.obtenerTrucosSuperados(u);
                ArrayList<Usuario> listaUsuarios=amigos(u);
                
                Usuario usuario=new Usuario(nombre,apellidos,pass,email,ciudad,edad,altura,peso,sexo,estilo,listaTablas,nivel,listaTrucos,ranking,puntuacion,listaUsuarios,id,foto);
                
                set.add(usuario);
            }
        }catch (SQLException ex){
            Logger.getLogger(PersistenciaUsuario.class.getName()).log(Level.SEVERE,null,ex);
        }finally{
            return set;
        }
    }
}
